package servidor.controle;

import java.sql.SQLException;
import java.util.ArrayList;

import servidor.modelo.Conta;
import servidor.modelo.Extrato;

public class ExtratoControlador {
	public static void cria(Conta conta, String operacao, String movimentacao,
			String data) throws SQLException {
		Sistema sistema = Sistema.getUnicaInstancia();
		Extrato extrato = sistema.getEntityManager().create(Extrato.class);
		extrato.setConta(conta);
		extrato.setOperacao(operacao);
		extrato.setMovimentacao(movimentacao);
		extrato.setData(data);
		extrato.save();
	}

	public static ArrayList<Extrato> getExtratoDaConta(int contaId) {
		Sistema sistema = Sistema.getUnicaInstancia();
		Extrato[] extratosArray;

		try {
			extratosArray = sistema.getEntityManager().find(Extrato.class,
					"contaId = ?", contaId);
		} catch (SQLException e) {
			extratosArray = new Extrato[0];
		}

		if (extratosArray.length == 0) {
			return null;
		}

		ArrayList<Extrato> extratos = new ArrayList<Extrato>();
		sistema.fromArrayToArrayList(extratosArray, extratos);

		return extratos;
	}

	public static ArrayList<Extrato> getExtratoDaConta(Conta conta) {
		return getExtratoDaConta(conta.getID());
	}

	public static Extrato get(int id) {
		Sistema sistema = Sistema.getUnicaInstancia();
		return sistema.getEntityManager().get(Extrato.class, id);
	}

	public static ArrayList<Extrato> getAll() throws SQLException {
		Sistema sistema = Sistema.getUnicaInstancia();
		Extrato[] extratosArray = sistema.getEntityManager()
				.find(Extrato.class);
		ArrayList<Extrato> extratos = new ArrayList<Extrato>();
		sistema.fromArrayToArrayList(extratosArray, extratos);
		return extratos;
	}

	private static void addToBuilder(StringBuilder sb, String s) {
		sb.append(String.format("%s\n", s)); // adiciona um valor a cada linha
	}

	private static void addToBuilder(StringBuilder sb, int i) {
		sb.append(String.format("%d\n", i)); // adiciona um valor a cada linha
	}

	private static void addToBuilderSemPular(StringBuilder sb, String s) {
		sb.append(String.format("%s", s)); // adiciona um valor a cada linha
	}

	private static void addToBuilderSemPular(StringBuilder sb, int i) {
		sb.append(String.format("%d", i)); // adiciona um valor a cada linha
	}

	public static String parseString(Extrato extrato) {
		StringBuilder sb = new StringBuilder();
		addToBuilder(sb, extrato.getID());
		addToBuilder(sb, extrato.getMovimentacao());
		addToBuilder(sb, extrato.getOperacao());
		addToBuilder(sb, extrato.getData());
		addToBuilderSemPular(sb, extrato.getConta().getID());
		return sb.toString();
	}

	public static String parseString(ArrayList<Extrato> extratos) {
		if (extratos == null)
			return "null";
		// StringBuilder tem a vantagem de não ficar alocando espaço para uma
		// string a cada mudança de valor
		StringBuilder sb = new StringBuilder();
		for (Extrato extrato : extratos) {
			addToBuilder(sb, parseString(extrato));
		}
		addToBuilderSemPular(sb, "END");
		return sb.toString();
	}

	public static void deletarExtrato(int id) {
		Sistema sistema = Sistema.getUnicaInstancia();
		ArrayList<Extrato> extrato = getExtratoDaConta(id);
		if (extrato != null) {
			for (int i = 0; i < extrato.size(); i++) {
				try {
					sistema.getEntityManager().delete(extrato.get(i));
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public static String getStringExtrato(Extrato extrato) {
		return extrato.getData() + " - " + extrato.getOperacao() + " - ("
				+ extrato.getMovimentacao() + ")";
	}
}
